#列表和元组之间的区别是什么？

#相同点
'''
它们在 Python 中都是序列类型的容器对象，
可以支持任何类型的数据存放、也同样支持切片和迭代等操作。
'''
list1 = [1,2,3,4,5]
#print(list1[0:2]) # [1,2]
tuple1 = (1,2,3,4,5)
#print(tuple1[0:2]) # (1,2)

#不同点
'''
1)列表是可变的，长度大小不固定，可以进行增删改等一系列操作。
而元组是不可变的。大小固定，不可以进行增删改操作。
你可以试着将一个元组重新赋值之后使用 id () 函数分别查看下新的元组和旧的元组在内存中的地址就知道了。
'''
'''
2)因为元组的不可变性，所以元组无法复制
'''
'''
3)可以使用元组作为字典的键，但是列表不可以。
'''
a = (1,2)
b = [1,2]
c = {a:'元组'} # 正确
print (c)
#c = {b:'列表'} # 错误
#print (b)
'''
包)在两者的性能方面，Python 会将低开销的较大的块分配给元组，因为它们是不可变的。 
对于列表则分配小内存块。 与列表相比，元组所支持的操作更少所以会更快一些。
但其实这一点并没必要去过分纠结，除非你有超巨量的数据需要去处理。
存储相同的元素时，列表的大小比元组要大。这是因为列表是动态的，它需要存储指针来指向对应的元素
'''
a = [1,2,3]
b = (1,2,3)
print(a.__sizeof__()) # 64
print(b.__sizeof__()) # 48


#为什么有了列表，还需要有元组？
'''之所以会有两种不同的数据结构是因为我们在使用的时候我们一般使用 List 
来存储同类型数据元素，使用元组来存储异构数据。'''
person = ("zhangsan",18,180)
point = (1,2) # 棋盘上的某一个点
points = [(1,2),(3,4),(5,6)] # 存储棋盘上所有的点

#拓展:序列（sequence）和容器（container）
'''
序列（sequence）是一种数据结构，每个元素都分配了一个索引 ，从 0 开始，
典型的序列就有列表，元组和字符串。其中列表可变，元组和字符串不可变。

容器（container）包含其他对象的任何对象。序列和映射（mapping）是两种主要的容器。
映射中的每个元素都分配了一个键，而字典是 python 中唯一内建的映射内型。
键可以是数字，字符串或元组。
'''
